
#define _CRT_SECURE_NO_WARNINGS 

//#include <stdio.h>
//
//int even(int n);
//
//int main()
//{
//    int n;
//
//    scanf("%d", &n);
//    if (even(n))
//        printf("%d is even.\n", n);
//    else
//        printf("%d is odd.\n", n);
//
//    return 0;
//}
//
//int even(int n)
//{
//    if (n % 2 == 0)
//        return 1;
//    else
//        return 0;
//}



//#include <stdio.h>
//
//#define MAXN 10
//typedef float ElementType;
//
//ElementType Average(ElementType S[], int N);
//
//int main()
//{
//    ElementType S[MAXN];
//    int N, i;
//
//    scanf("%d", &N);
//    for (i = 0; i < N; i++)
//        scanf("%f", &S[i]);
//    printf("%.2f\n", Average(S, N));
//
//    return 0;
//}
//ElementType Average(ElementType S[], int N)
//{
//    double result = 0;
//    for (int i = 0; i < N; i++)
//    {
//        result += S[i];
//    }
//    return result / N;
//}


//
//#include <stdio.h>
//
//#define MAXN 10
//
//int Sum(int List[], int N);
//
//int main()
//{
//    int List[MAXN], N, i;
//
//    scanf("%d", &N);
//    for (i = 0; i < N; i++)
//        scanf("%d", &List[i]);
//    printf("%d\n", Sum(List, N));
//
//    return 0;
//}
//
//int Sum(int List[], int N)
//{
//    int result = 0;
//    for (int i = 0; i < N; i++)
//    {
//        result += List[i];
//    }
//    return result;
//}




//#include <stdio.h>
//
//#define MAXN 10
//typedef float ElementType;
//
//ElementType Max(ElementType S[], int N);
//
//int main()
//{
//    ElementType S[MAXN];
//    int N, i;
//
//    scanf("%d", &N);
//    for (i = 0; i < N; i++)
//        scanf("%f", &S[i]);
//    printf("%.2f\n", Max(S, N));
//
//    return 0;
//}
//
//ElementType Max(ElementType S[], int N)
//{
//    ElementType max = S[0];
//    for (int i = 1; i < N; i++)
//    {
//        if (S[i] > max)
//            max = S[i];
//    }
//    return max;
//}


//#include<stdio.h>
//#include<math.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int arr[1000] = { 0 };
//	int i = 0;
//	while (n)
//	{
//		arr[i++] = n % 10;
//		n /= 10;
//	}
//	printf("%d", arr[0] * 100 + arr[1] * 10 + arr[2]);
//	return 0;
//}



//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= i; j++)
//		{
//			printf("%d*%d=%-4d", i, j, i * j);
//		}
//		printf("\n");
//	}
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//
//	int n = 0;
//	scanf("%d", &n);
//	for (int f = 0; f < 100; f++)
//	{
//		for (int y = 0; y < 100; y++)
//		{
//			if (98 * f - 199 * y == n)
//			{
//				printf("%d.%d", y, f);
//				return 0;
//			}
//		}
//	}
//	printf("No Solution");
//	return 0;
//}





//#include<stdio.h>
//int main()
//{
//	i x = 0;
//	float y = 0;
//	do
//	{
//		scanf("%d", &x);
//	} while (x >= 0);
//	if (x < 15)
//		y = 4 * x / 3;
//	else
//		y = 2.5 * x - 17.5;
//	printf("%.2lf", y);
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int count = 0;
//	for (int i = n; i < n+4; i++)
//	{
//		for (int j = n; j < n+4; j++)
//		{
//			for (int k = n; k < n+4 ;k++)
//			{
//				if(i!=k&&i != j && k != j)
//				{
//					printf("%d", i * 100 + j * 10 + k);
//					count++;
//					if (count % 6 == 0)
//					{
//						printf("\n"); break;
//					}
//					printf(" ");
//				}
//				
//			}
//		}
//		
//	}
//	return 0;
//}




#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int x, y;
	int flag = 1;
	for (x = 1; x < 100; x++)
	{
		for ( y = x; y < 100; y++);
		{
			if (x * x + y * y == n) 
			{
				if (x <= y)
				{
					printf("%d %d\n", x, y);
					flag = 0;
				}
			}
		}
	}
	if(flag)
	printf("No Solution");
	return 0;
}